DenoからGoogle Apps Scriptの型定義ファイルを使えるか試す
2021-07-11
型定義ファイルはこちら
どうやって使えばいいかな?
18:34:39 そのまま使うのは無理そう
型定義ファイルのmodule解決の方法がNode用になっている
対策
Deno用に書き換える
/// <reference path="を/// <reference path="./に置換すればいけそう
こんな感じのscriptを組む
code:sh
code:test.ts
import {download} from "./fetch.js";
download();
code:fetch.d.ts
export function download(): Promise<void>;
code:fetch.js
// 認証
const octokit = new Octokit({ auth: Deno.args0 }); export async function download() {
await expand('types/google-apps-script');
}
async function expand(path) {
const options = {
owner: 'DefinitelyTyped',
repo: 'DefinitelyTyped',
ref: 'master',
};
const {data} = await octokit.rest.repos.getContent({
path,
...options,
});
for (const content of data) {
if (content.type === 'dir') {
if (!(await exists(content.name))) {
await Deno.mkdir(content.name);
}
await Deno.chdir(content.name);
await expand(content.path);
await Deno.chdir('../');
continue;
}
const res = await fetch(content.download_url);
const code = await res.text();
await Deno.writeTextFile(content.name, code);
}
}
2. /// <reference path="を/// <reference path="./に置換する
code:sh
code:test2.ts
import {convert} from "./convert.ts";
convert();
code:convert.ts
export async function convert() {
for await (const file of expandGlob('**/*.ts')) {
const code = await Deno.readTextFile(file.path);
await Deno.writeTextFile(
file.path,
//code.replaceAll(/// <reference path=", /// <reference path="./)
code.replace(/\/\/\/\s*<reference\s*path="(^"+)"\s*\/>/g, '/// <reference path="./$1" />\n// @deno-types="./$1"') );
}
}
19:59:14 codeは完成した
code:sh
code:script.ts
import {download} from "./fetch.js";
import {convert} from "./convert.ts";
await download();
await convert();
/icons/fail.iconesm.shなどで型定義ファイルをbundleできないか試す
18:36:18 だめでした
エラーが出てしまった
20:53:02 githubに型定義ファイルを置いた
20:57:46 あれ?GitHubから直接importしようとすると読み込めない?
まじかー……takker.icon
流石に全てのnamed Importを書くのは大変だぞ……
自動置換では対処できない
副作用付きimportでなんとかなるかな?
なんとかならなかった
global変数は副作用付きimportでなんとかなるけど、それ以外の型はnamed importしないと無理
毎回毎回localに型定義をdownloadするか、Denoから読み込めるような型定義ファイルを自作するしかないなあ……
もうメンテはされていない模様
2021-07-25
やってみる
code:bash
code:script2.ts
import {download} from "./fetch.js";
import {convert} from "./convert2.ts";
await download();
await convert();
code:convert2.ts
export async function convert() {
for await (const file of expandGlob('**/*.ts')) {
const code = await Deno.readTextFile(file.path);
await Deno.writeTextFile(
file.path,
//code.replaceAll(/// <reference path=", /// <reference path="./)
code.replace(/\/\/\/\s*<reference\s*path="(^"+)"\s*\/>/g, '/// <reference types="./$1" />') );
}
}